package ve.usb.crm;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.crm.hibernate.*;

import java.util.Iterator;
import java.util.List;
import ve.usb.cohesion.runtime.Pair;
import java.util.Date;
import ve.usb.cohesion.runtime.LocalDate;
import java.util.ArrayList;
import org.hibernate.LockMode;

/**
 * 
 */
public class AccionesSoporteTecnico extends CohesionAction {

    /**
     * Called by Struts for the execution of action APreContactos.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreSoportesTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VSoportesTecnico",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador, empleado
//        if (!CohesionActor.checkActor(request, 5)) {
//            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
//        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            //Saco la lista de todos los contactos
            List<SoporteTecnico> L_SoporteTecnico = new ArrayList<SoporteTecnico>();
            L_SoporteTecnico = (List<SoporteTecnico>) s.createQuery("from SoporteTecnico").list();


            //Subo el atributo al request
            request.setAttribute("L_SoporteTecnico", L_SoporteTecnico);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreCrearContacto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreCrearSoporteTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearSoporteTecnico",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador
        if (!CohesionActor.checkActor(request, 5)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            //Genero el formulario
            FCrearSoporteTecnico ffCrearSoporteTecnico = FCrearSoporteTecnico.clear(mapping, request);



            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action ACrearContacto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward ACrearSoporteTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreSoporteTecnico", "VCrearSoporteTecnico",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            FCrearSoporteTecnico ffCrearSoporteTecnico = (FCrearSoporteTecnico) form;
            boolean hayError = false;

            //Inicializo el contacto y la fecha
            SoporteTecnico nuevoSoporteTecnico = new SoporteTecnico();



            //Verifico si el usuario es nuevo o viejo para modificarlo
            if (ffCrearSoporteTecnico.getIdSoporteTecnico() != 0l) {
                nuevoSoporteTecnico = (SoporteTecnico) s.createQuery("from SoporteTecnico where idSoporteTecnico = :idSoporteTecnico").setLong("idSoporteTecnico", ffCrearSoporteTecnico.getIdSoporteTecnico()).uniqueResult();
            }

            //Se verifica que el nombre sea válido
            if (ffCrearSoporteTecnico.getNombre().compareTo("") == 0) {
                hayError = true;
                request.setAttribute("nombreError", "<span class='ui-icon ui-icon-alert' style='float: left; margin-right: .3em;'></span>Debe colocar un nombre v&aacute;lido");
            }


            if (hayError) {

                salida = SALIDA_1;
            } else {
                nuevoSoporteTecnico.setNombre(ffCrearSoporteTecnico.getNombre());

                if (ffCrearSoporteTecnico.getIdSoporteTecnico() == 0) {
                    s.save(nuevoSoporteTecnico);
                } else {
                    nuevoSoporteTecnico.setIdSoporteTecnico(ffCrearSoporteTecnico.getIdSoporteTecnico());
                    s.update(nuevoSoporteTecnico);
                }
                s.flush();
            }

            request.setAttribute("idSoporteTecnico", nuevoSoporteTecnico.getIdSoporteTecnico());
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreContacto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreSoporteTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VSoporteTecnico", "APreSoportesTenicos",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador, cliente
        if (!CohesionActor.checkActor(request, 7)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            Long idSoporteTecnico = (Long) request.getAttribute("idSoporteTecnico");
            if (idSoporteTecnico == null) {
                idSoporteTecnico = lookup_Long(request, "idSoporteTecnico");
            }

            if (idSoporteTecnico == null) {
                salida = SALIDA_1;
            } else {
                SoporteTecnico soporteTecnico = (SoporteTecnico) s.load(SoporteTecnico.class, idSoporteTecnico);

                Hibernate.initialize(soporteTecnico);

                List<PreguntasRespuestas> L_PreguntasR = (List<PreguntasRespuestas>) s.createQuery("from PreguntasRespuestas where idSoporteTecnico = :idSoporteTecnico").setLong("idSoporteTecnico", soporteTecnico.getIdSoporteTecnico()).list();

                List<PreguntasRespuestas> LPreguntasRPadres = new ArrayList<PreguntasRespuestas>();

                for (Iterator<PreguntasRespuestas> it = L_PreguntasR.iterator(); it.hasNext();) {
                    PreguntasRespuestas preguntasRespuestas = it.next();

                    if (preguntasRespuestas.getPadre() == null) {
                        Hibernate.initialize(preguntasRespuestas);

                        LPreguntasRPadres.add(preguntasRespuestas);
                    }

                }
                request.setAttribute("L_Preguntas", LPreguntasRPadres);
                request.setAttribute("SoporteTecnico", soporteTecnico);
            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APrePregunta(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VPregunta", "APreSoporteTecnico",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador, cliente
        if (!CohesionActor.checkActor(request, 7)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            Long idPregunta = (Long) request.getAttribute("idPregunta");
            if (idPregunta == null) {
                idPregunta = lookup_Long(request, "idPregunta");
            }

            if (idPregunta == null) {
                salida = SALIDA_1;
            } else {
                PreguntasRespuestas preguntasRespuestas = (PreguntasRespuestas) s.load(PreguntasRespuestas.class, idPregunta);

                Hibernate.initialize(preguntasRespuestas);
                Hibernate.initialize(preguntasRespuestas.getPadre());
                Hibernate.initialize(preguntasRespuestas.getIdSoporteTecnico());

                List<PreguntasRespuestas> L_PreguntasR = (List<PreguntasRespuestas>) s.createQuery("from PreguntasRespuestas where padre = :idPadre").setLong("idPadre", preguntasRespuestas.getIdPreguntasRespuestas()).list();


                for (Iterator<PreguntasRespuestas> it = L_PreguntasR.iterator(); it.hasNext();) {
                    PreguntasRespuestas preguntasRespuestasI = it.next();


                    Hibernate.initialize(preguntasRespuestasI);

                }

                List<PreguntasRespuestas> L_Padres = padresPreguntas(preguntasRespuestas);

                request.setAttribute("L_Padres", L_Padres);
                request.setAttribute("L_Preguntas", L_PreguntasR);
                request.setAttribute("preguntaR", preguntasRespuestas);
                if (preguntasRespuestas.getPadre() != null) {
                    request.setAttribute("idPadre", preguntasRespuestas.getPadre().getIdPreguntasRespuestas());
                }

                request.setAttribute("idSoporte", preguntasRespuestas.getIdSoporteTecnico());
            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreEliminarContacto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreEliminarSoporteTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreSoportesTecnico",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            //Consigo el id del contacto
            Long idContacto = lookup_Long(request, "idContacto");
            Contacto contacto = (Contacto) s.load(Contacto.class, idContacto);

            List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where contactorelacionado = :resp").setLong("resp", idContacto).list();
            for (Tarea t : tarea) {
                t.setEsActivo(false);
                s.update(t);
                s.flush();
            }
            // lo borro y verifico que lo alla borrado
            contacto.setEsActivo(false);
            s.update(contacto);
            s.flush();

            try {
                s.flush();
            } catch (Exception ex1) {
                ex1.printStackTrace();
                //salida = SALIDA_1;
                request.setAttribute("msg", "No se pudo eliminar entidad.");
            }

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action APreEditarContacto.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward APreEditarSoporteTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VCrearSoporteTecnico",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            Long idSoporteTecnico = (Long) lookup_Long(request, "idSoporteTecnico");

            SoporteTecnico soporteTecnico = (SoporteTecnico) s.createQuery("from SoporteTecnico where idSoporteTecnico = :idSoporteTecnico").setLong("idSoporteTecnico", idSoporteTecnico).uniqueResult();


            FCrearSoporteTecnico ffCrearSoporteTecnico = FCrearSoporteTecnico.clear(mapping, request);

            ffCrearSoporteTecnico.setIdSoporteTecnico(soporteTecnico.getIdSoporteTecnico());
            ffCrearSoporteTecnico.setNombre(soporteTecnico.getNombre());


            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreAgregarPreguntasSoporteTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VAgregarPregunta",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            Long idPregunta = (Long) lookup_Long(request, "idPregunta");
            Long idSoporteTecnico = (Long) lookup_Long(request, "idSoporteTecnico");
            Long idPadre = (Long) lookup_Long(request, "idPadre");

            FCrearPregunta ffCrearPregunta = FCrearPregunta.clear(mapping, request);

            if (idPregunta != null) {
                ffCrearPregunta.setIdPregunta(idPregunta);
                PreguntasRespuestas pregunta = (PreguntasRespuestas) s.load(PreguntasRespuestas.class, idPregunta);
                ffCrearPregunta.setPregunta(pregunta.getPreguntaRespuesta());
                ffCrearPregunta.setEsPregunta(pregunta.isEsPregunta());
            }
            if (idSoporteTecnico != null) {
                ffCrearPregunta.setIdSoporteTecnico(idSoporteTecnico);
            }
            if (idPadre != null) {
                ffCrearPregunta.setIdPadre(idPadre);
            }
//
//            SoporteTecnico soporteTecnico = (SoporteTecnico) s.createQuery("from SoporteTecnico where idSoporteTecnico = :idSoporteTecnico").setLong("idSoporteTecnico", idSoporteTecnico).uniqueResult();
//
//
//            FCrearSoporteTecnico ffCrearSoporteTecnico = FCrearSoporteTecnico.clear(mapping, request);
//
//            ffCrearSoporteTecnico.setIdSoporteTecnico(soporteTecnico.getIdSoporteTecnico());
//            ffCrearSoporteTecnico.setNombre(soporteTecnico.getNombre());


            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward AAgregarPreguntasSoporteTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APreSoporteTecnico", "APrePregunta"};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            FCrearPregunta ffCrearPregunta = (FCrearPregunta) form;

            PreguntasRespuestas preguntasRespuestas = new PreguntasRespuestas();

            if (ffCrearPregunta.getIdPregunta() != 0l) {
                preguntasRespuestas = (PreguntasRespuestas) s.load(PreguntasRespuestas.class, ffCrearPregunta.getIdPregunta());
            }

            preguntasRespuestas.setEsPregunta(ffCrearPregunta.getEsPregunta());
            if (ffCrearPregunta.getIdPadre() != 0l) {
                preguntasRespuestas.setPadre((PreguntasRespuestas) s.load(PreguntasRespuestas.class, ffCrearPregunta.getIdPadre()));

            }
            if (ffCrearPregunta.getIdSoporteTecnico() != 0l) {
                preguntasRespuestas.setIdSoporteTecnico((SoporteTecnico) s.load(SoporteTecnico.class, ffCrearPregunta.getIdSoporteTecnico()));

            }

            preguntasRespuestas.setPreguntaRespuesta(ffCrearPregunta.getPregunta());

            s.save(preguntasRespuestas);
            s.flush();

            SoporteTecnico soporteTecnico = (SoporteTecnico) s.load(SoporteTecnico.class, preguntasRespuestas.getIdSoporteTecnico().getIdSoporteTecnico());
//
            if (ffCrearPregunta.getIdPadre() != 0l) {
                salida = SALIDA_1;
                request.setAttribute("idPregunta", preguntasRespuestas.getPadre().getIdPreguntasRespuestas());
            } else {

                request.setAttribute("idSoporteTecnico", soporteTecnico.getIdSoporteTecnico());
            }

//            SoporteTecnico soporteTecnico = (SoporteTecnico) s.createQuery("from SoporteTecnico where idSoporteTecnico = :idSoporteTecnico").setLong("idSoporteTecnico", idSoporteTecnico).uniqueResult();
//
//
//            FCrearSoporteTecnico ffCrearSoporteTecnico = FCrearSoporteTecnico.clear(mapping, request);
//
//            ffCrearSoporteTecnico.setIdSoporteTecnico(soporteTecnico.getIdSoporteTecnico());
//            ffCrearSoporteTecnico.setNombre(soporteTecnico.getNombre());


            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreAplicarServicioTecnico(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VAplicarServicioTecnico",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador, empleado
//        if (!CohesionActor.checkActor(request, 5)) {
//            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
//        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            //Saco la lista de todos los contactos
            List<SoporteTecnico> L_SoporteTecnico = new ArrayList<SoporteTecnico>();
            L_SoporteTecnico = (List<SoporteTecnico>) s.createQuery("from SoporteTecnico").list();


            //Subo el atributo al request
            request.setAttribute("L_SoporteTecnico", L_SoporteTecnico);

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreAplicarSoporte(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VAplicarSoporte",};
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors administrador, empleado
//        if (!CohesionActor.checkActor(request, 5)) {
//            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
//        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            Long idSoporteTecnico = (Long) request.getAttribute("idSoporteTecnico");
            if (idSoporteTecnico == null) {
                idSoporteTecnico = lookup_Long(request, "idSoporteTecnico");
            }

            if (idSoporteTecnico == null) {
            } else {
                SoporteTecnico soporteTecnico = (SoporteTecnico) s.load(SoporteTecnico.class, idSoporteTecnico);

                Hibernate.initialize(soporteTecnico);

                List<PreguntasRespuestas> L_PreguntasR = (List<PreguntasRespuestas>) s.createQuery("from PreguntasRespuestas where idSoporteTecnico = :idSoporteTecnico").setLong("idSoporteTecnico", soporteTecnico.getIdSoporteTecnico()).list();

                List<PreguntasRespuestas> LPreguntasRPadres = new ArrayList<PreguntasRespuestas>();

                for (Iterator<PreguntasRespuestas> it = L_PreguntasR.iterator(); it.hasNext();) {
                    PreguntasRespuestas preguntasRespuestas = it.next();

                    if (preguntasRespuestas.getPadre() == null) {
                        Hibernate.initialize(preguntasRespuestas);

                        LPreguntasRPadres.add(preguntasRespuestas);
                    }

                }

                request.setAttribute("L_Preguntas", LPreguntasRPadres);
                request.setAttribute("SoporteTecnico", soporteTecnico);
            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward APreAplicarPregunta(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VAplicarPregunta", "APreAplicarServicioTecnico", "VCrearSoporteCliente"};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;
        final int SALIDA_2 = 2;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador, cliente
        if (!CohesionActor.checkActor(request, 7)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            Long idPregunta = (Long) request.getAttribute("idPregunta");
            if (idPregunta == null) {
                idPregunta = lookup_Long(request, "idPregunta");
            }

            if (idPregunta == null) {
                salida = SALIDA_1;
            } else {
                PreguntasRespuestas preguntasRespuestas = (PreguntasRespuestas) s.load(PreguntasRespuestas.class, idPregunta);

                if (preguntasRespuestas.isEsPregunta()) {
                    Hibernate.initialize(preguntasRespuestas);
                    Hibernate.initialize(preguntasRespuestas.getPadre());
                    Hibernate.initialize(preguntasRespuestas.getIdSoporteTecnico());

                    List<PreguntasRespuestas> L_PreguntasR = (List<PreguntasRespuestas>) s.createQuery("from PreguntasRespuestas where padre = :idPadre").setLong("idPadre", preguntasRespuestas.getIdPreguntasRespuestas()).list();


                    for (Iterator<PreguntasRespuestas> it = L_PreguntasR.iterator(); it.hasNext();) {
                        PreguntasRespuestas preguntasRespuestasI = it.next();


                        Hibernate.initialize(preguntasRespuestasI);

                    }

                    List<PreguntasRespuestas> Padres = new ArrayList<PreguntasRespuestas>();

                    PreguntasRespuestas conseguirPadre = preguntasRespuestas;
                    while (conseguirPadre.getPadre() != null) {
                        Hibernate.initialize(conseguirPadre.getPadre());
                        Padres.add(conseguirPadre.getPadre());
                        conseguirPadre = conseguirPadre.getPadre();
                    }

                    request.setAttribute("L_Preguntas", L_PreguntasR);
                    request.setAttribute("preguntaR", preguntasRespuestas);

                    if (preguntasRespuestas.getPadre() != null) {
                        request.setAttribute("idPadre", preguntasRespuestas.getPadre().getIdPreguntasRespuestas());
                    }

                    request.setAttribute("idSoporte", preguntasRespuestas.getIdSoporteTecnico());
                } else {
                    salida = SALIDA_2;

                    FCrearPreguntaCliente ffCrearPreguntaCliente = FCrearPreguntaCliente.clear(mapping, request);

                    ffCrearPreguntaCliente.setIdPregunta(idPregunta);

                    {
                        List<Pair> list =
                                (List<Pair>) s.createQuery(
                                "select new ve.usb.cohesion.runtime.Pair(nombre, idContacto) "
                                + "from Contacto").list();
                        list.add(0, new Pair("Ninguna", 0));
                        ffCrearPreguntaCliente.setListContacto(list);
                    }



                }

            }
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    public ActionForward ACrearSoporteCliente(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VHome",};
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors empleado, administrador, cliente
        if (!CohesionActor.checkActor(request, 7)) {
            return mapping.findForward(CohesionActor.SALIDA_ACTOR);
        }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            FCrearPreguntaCliente ffCrearPregunta = (FCrearPreguntaCliente) form;

            ContactoPregunta contactoPregunta = new ContactoPregunta();

            contactoPregunta.setContacto((Contacto) s.load(Contacto.class, ffCrearPregunta.getContacto()));
            contactoPregunta.setPregunta((PreguntasRespuestas) s.load(PreguntasRespuestas.class, ffCrearPregunta.getIdPregunta()));
            Date fechaac = new Date();
            contactoPregunta.setFechaCreacion(fechaac);
            s.save(contactoPregunta);
            s.flush();

            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try {
                s.close();
            } catch (Exception ex2) {
            }
        }
        return mapping.findForward(SALIDAS[salida]);
    }

    /**
     * Called by Struts for the execution of action AClienteContacto.
     *
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions.
     * These exceptios will normally be treated with
     * the default exception action.
     */
    private void cargarCollection(FCrearCuenta fFCrearCuenta, Session s) {

        Long tipoCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'tipo'").uniqueResult();
        Long sectionCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'sector'").uniqueResult();

        {
            List<Pair> list =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idPersonal) "
                    + "from Personal").list();
            list.add(0, new Pair("Ninguna", 0));
            fFCrearCuenta.setListPersonal(list);
        }

        {
            List<Pair> listTipo =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                    + "from Categoria where tipo= :idCategoria").setLong("idCategoria", tipoCategoria).list();
            listTipo.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearCuenta.setListTipoCategoria(listTipo);
        }


        {
            List<Pair> listSection =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                    + "from Categoria where tipo=:idCategoria").setLong("idCategoria", sectionCategoria).list();
            listSection.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearCuenta.setListSectorCategoria(listSection);
        }

    }

    private void cargarCollection(FCrearTarea fFCrearTarea, Session s) {

        Long asuntoCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'asunto'").uniqueResult();
        Long prioridadCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'prioridad'").uniqueResult();


        {
            List<Pair> list =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idPersonal) "
                    + "from Personal").list();
            list.add(0, new Pair("Ninguna", 0));
            fFCrearTarea.setListaPersonal(list);
        }

        {
            List<Pair> listAsunto =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                    + "from Categoria where tipo= :idCategoria").setLong("idCategoria", asuntoCategoria).list();
            listAsunto.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearTarea.setListAsunto(listAsunto);
        }


        {
            List<Pair> prioridadSection =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                    + "from Categoria where tipo=:idCategoria").setLong("idCategoria", prioridadCategoria).list();
            prioridadSection.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearTarea.setListaPrioridad(prioridadSection);
        }


        {
            List<Pair> listContactos =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idContacto) "
                    + "from Contacto").list();
            listContactos.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearTarea.setListaContactos(listContactos);
        }

        {
            List<Pair> listCuentas =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCuenta) "
                    + "from Cuentas").list();
            listCuentas.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearTarea.setListaCuentas(listCuentas);
        }


        {
            List<Pair> listOportunidades =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idOportunidad) "
                    + "from Oportunidad").list();
            listOportunidades.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearTarea.setListaContactos(listOportunidades);
        }


    }

    private void cargarCollection(FCrearContacto fFCrearContacto, Session s) {

        Long tituloCategoria = (Long) s.createQuery("select idCategoria from Categoria where nombre = 'titulo'").uniqueResult();


        {
            List<Pair> list =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idPersonal) "
                    + "from Personal").list();
            list.add(0, new Pair("Ninguna", 0));
            fFCrearContacto.setListPersonal(list);
        }

        {
            List<Pair> listTipo =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCategoria) "
                    + "from Categoria where tipo= :idCategoria").setLong("idCategoria", tituloCategoria).list();
            listTipo.add(0, new ve.usb.cohesion.runtime.Pair("Ninguna", 0));
            fFCrearContacto.setListTitulo(listTipo);

        }

        {
            List<Pair> list =
                    (List<Pair>) s.createQuery(
                    "select new ve.usb.cohesion.runtime.Pair(nombre, idCuenta) "
                    + "from Cuenta").list();
            list.add(0, new Pair("Ninguna", 0));
            fFCrearContacto.setListCuenta(list);
        }

    }

    public List<PreguntasRespuestas> padresPreguntas(PreguntasRespuestas pregunta) {

        List<PreguntasRespuestas> padres = new ArrayList<PreguntasRespuestas>();

        PreguntasRespuestas actual = pregunta;

        while (actual.getPadre() != null) {

            padres.add(actual.getPadre());
            actual = actual.getPadre();
        }

        List<PreguntasRespuestas> retorno = new ArrayList<PreguntasRespuestas>();

        for (int i = padres.size() - 1; i >= 0; i--) {
            PreguntasRespuestas preguntasRespuestas = padres.get(i);
            retorno.add(preguntasRespuestas);

        }

        return retorno;

    }

    public void borrarPregunta(PreguntasRespuestas pregunta) {

        List<PreguntasRespuestas> padres = new ArrayList<PreguntasRespuestas>();

        PreguntasRespuestas actual = pregunta;

        while (actual.getPadre() != null) {

            padres.add(actual.getPadre());
            actual = actual.getPadre();
        }

        List<PreguntasRespuestas> retorno = new ArrayList<PreguntasRespuestas>();

        for (int i = padres.size() - 1; i >= 0; i--) {
            PreguntasRespuestas preguntasRespuestas = padres.get(i);
            retorno.add(preguntasRespuestas);

        }

        

    }
}
